<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
        <!--
        面试题:
        1. prototype 和 __proto__ 
        每个对象都有一个__proto__属性，并且指向它的prototype原型对象
        每个构造函数都有一个prototype原型对象
        prototype原型对象里的constructor指向构造函数本身
        
        2.原型链
        在JavaScript中万物都是对象，对象和对象之间也有关系，并不是孤立存在的。
        对象之间的继承关系，在JavaScript中是通过prototype对象指向父类对象，
        直到指向Object对象为止，这样就形成了一个原型指向的链条，专业术语称之为原型链。
    -->
</head>
<body>
    
</body>
<script>
    //创建Object类型的对象  属性名1:值1，属性名2:值2，方法名:function(){}
    var person = {
        //属性
        username:'张三',
        gender:'男',
        birthday:2000,
        
        //方法
        age:function(){
            return new Date().getFullYear() - this.birthday;
        }
    };
    console.log(person)
    
    console.log(person.valueOf())
    //对象名.属性名
    console.log(person.username)
    console.log(person["gender"])
    //对象名.方法名()
    console.log(person.age())
    
    //创建Object对象
    var student = {
        //属性
        username:"李四",
        
        //方法
        eat:function(){
            console.log(this.username+"正在吃饭....")
        }
    }
    //将student的原型指向person
    student.__proto__ = person;
    console.log(student)
    console.log(student.username)
    console.log(student.gender)
    console.log(student.age())
    student.eat()
    
    console.log("--------ES6 语法---------")
    
    //创建Animal类
    class Animal{
        //构造器
        constructor(name , age) {
            //声明属性 ： this.属性名
            this.name = name;
            this.age = age;
        }
        
        //声明方法
        eat(){
            console.log(this.name+"正在吃东西...")
        }
    }
    
    //创建对象
    var animal = new Animal('动物',3)
    console.log(animal)
    //获取属性 对象名.属性名
    console.log(animal.name)
    console.log(animal.age)
    //执行方法 对象名.方法名
    animal.eat()
    
    //创建Tiger类 将Tiger的原型指向Animal
    class Tiger extends Animal{
        //构造器
        constructor(name , age , gender) {
            //super(父类属性)
            super(name , age)
            this.gender = gender
        }
        
        //方法
        hunt(){
            console.log("一只"+this.gender+this.name+"正在狩猎...")
        }
    }
    //创建Tiger对象
    var tiger = new Tiger("华南虎",5,'公');
    console.log(tiger)
    console.log(tiger.name)
    console.log(tiger.age)
    console.log(tiger.gender)
    tiger.eat();
    tiger.hunt();
    
</script>
<script>
    console.log('--------------------Object 对象 ----------------------------')
    //1.练习:有一个黄色的小狗,叫大黄,今年已经三岁了,250斤的重量每次走路都很慢,喜欢吃大骨头
    class Dog {
        constructor({ name, color, age, weight, food }) {
            this.name = name;
            this.color = color;
            this.age = age;
            this.weight = weight;
            this.food = food;
        }
        describe() {
            console.log(
            `有一个${this.color}的小狗，叫${this.name}，今年已经${this.age}岁了，` +
            `体重${this.weight}斤，每次走路都很慢，喜欢吃${this.food}。`
            );
        }
    }

    var daHuang = new Dog({
        name: '大黄',
        color: '黄色',
        age: 3,
        weight: 250,
        food: '大骨头'
        });
    daHuang.describe();


    //2.练习:创建一个手机对象,手机有型号,有颜色,可以打电话和发短信，并遍历对象属性输出

    class Phone {
    constructor(type, color) {
        this.type = type;
        this.color = color;
    }

    call(phoneNumber) {
        console.log(`正在拨打 ${phoneNumber}...`);
    }

    sendMessage(phoneNumber) {
        console.log(`正在向 ${phoneNumber} 发送短信`);
    }
}

let myPhone = new Phone("小米", "白色");

console.log("手机属性列表:");
for (let i in myPhone) {
    console.log(`${i}: ${myPhone[i]}`);
}
myPhone.call("12312312322");
myPhone.sendMessage("12312312322");

</script>
</html>